home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / test / teste.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  1.6 KB  |  55 lines  |  [TEXT/R*ch]

  1. (* Floating-point exceptions.  Works for 64-bit arithmetic on PCs *)
  2.  
  3. val MAXDOUBLE = 8.98846567431157E307;
  4. val MINDOUBLE = 4.940656458412465442e~324
  5. (* Used to be   4.94065645841246544e~324 *)
  6.  
  7. val pi = 3.14159265358979323846;
  8. val eps = 1E~14;
  9. infix seq
  10. fun e1 seq e2 = e2;
  11.  
  12. fun check1 (opr, a, r) =
  13.     let val res = opr a
  14.     in
  15.     if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps
  16.     then "OK" else "WRONG"
  17.     end;
  18.  
  19. check1(abs, 1.9E~212, 1.9E~212);
  20. check1(abs, ~1.9E~212, 1.9E~212);
  21. check1(~, 1.9E~212, ~1.9E~212);
  22. check1(~, ~1.9E~212, 1.9E~212);
  23. check1(real, 515, 515.0);
  24. check1(real, ~515, ~515.0);
  25.  
  26. fun check2 (opr, a1, a2, r) =
  27.     let val res = opr(a1, a2)
  28.     in
  29.     if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps
  30.     then "OK" else "WRONG"
  31.     end;
  32.  
  33. check2(op+, 1.6, 2.3, 3.9);
  34. check2(op+, ~1E123, 2E124, 190E122);
  35. check2(op-, 16.0, 28.0, ~12.0);
  36. check2(op-, ~8E23, 4E24, ~480E22);
  37. check2(op*, 1E100, 1.234E8, 1.234E108);
  38. check2(op*, 1E~100, 1.234E~8, 1.234E~108);
  39. check2(op/, 0E500, 1.0, 0.0);
  40. check2(op/, 1.0, ~1E~80, ~1E80);
  41.  
  42. (1.0/0.0    seq "WRONG") handle Div => "OK";
  43. ((~1.0)/0.0 seq "WRONG") handle Div => "OK";
  44. (1.0/(~0.0) seq "WRONG") handle DIv => "OK";
  45.  
  46. (MAXDOUBLE + 1E300       seq "WRONG") handle Overflow => "OK";
  47. (~MAXDOUBLE - 1E300      seq "WRONG") handle Overflow => "OK";
  48. (MAXDOUBLE * 1.000000001 seq "WRONG") handle Overflow => "OK";
  49. (1.0 / MINDOUBLE         seq "WRONG") handle Overflow => "OK";
  50.  
  51. if MAXDOUBLE + ~MAXDOUBLE = 0.0 then "OK" else "WRONG";
  52.  
  53. fun f x = let val x2 = x / 2.0;
  54.       in MINDOUBLE/x2 + f x2 handle Div => 1.17 end;
  55.